/*
 * osobnik.cpp
 *
 * Copyright (C) 2008, 2009
 *
 * Lukasz Bieniasz-Krzywiec
 * Dariusz Leniowski
 *
 */

#include "osobnik.h"
#include "osobnik_mieszany.h"

/* ALLC */

osobnik_allc::~osobnik_allc() {}

osobnik_allc::osobnik_allc(int ktory) : osobnik(ktory, OSOBNIK_ALLC) {
  int sasiad; FOREN(sasiad) krawedzie[sasiad] = r->rand();
}

void osobnik_allc::nowa_strategia() { strategia = (real) 1.0;  timestamp = time; }

void osobnik_allc::rozpoczecie_epoki() {}

void osobnik_allc::zakonczenie_epoki() {}

void osobnik_allc::wypisz(FILE *F) { fprintf(F, "allc"); }

/* ALLD */

osobnik_alld::~osobnik_alld() {}

osobnik_alld::osobnik_alld(int ktory) : osobnik(ktory, OSOBNIK_ALLD) {
  int sasiad; FOREN(sasiad) krawedzie[sasiad] = r->rand();
}

void osobnik_alld::nowa_strategia() { strategia = (real) 0.0;  timestamp = time; }

void osobnik_alld::rozpoczecie_epoki() {}

void osobnik_alld::zakonczenie_epoki() {}

void osobnik_alld::wypisz(FILE *F) { fprintf(F, "alld"); }

/* OSOBNIKI NIETOPERZE */

osobnik_nietoperz::osobnik_nietoperz(int ktory, int rodzaj, real _s) : osobnik(ktory, rodzaj), s(_s) {}
void osobnik_nietoperz::nowa_strategia() { strategia = (r->rand()<0.01)? 1-s:s; timestamp = time; }
void osobnik_nietoperz::rozpoczecie_epoki() { int v; FOREN(v) krawedzie[v] = ((populacja[v]->rodzaj == rodzaj)^(r->rand()<0.3))? 1 : 0; }
void osobnik_nietoperz::zakonczenie_epoki() {};
void osobnik_nietoperz::wypisz(FILE *F) { fprintf(F, "toperz(" REALF ")", s); }

osobnik_nietoperz_zly::osobnik_nietoperz_zly(int ktory) : osobnik_nietoperz(ktory, OSOBNIK_NIETOPERZ_ZLY, 0.0) {}
osobnik_nietoperz_dobry::osobnik_nietoperz_dobry(int ktory) : osobnik_nietoperz(ktory, OSOBNIK_NIETOPERZ_DOBRY, 1.0) {}

/* OSOBNIK MIESZANY */

const char * lubi_losowy::nazwa = "lubi_losowy";
const char * lubi_wszystkich::nazwa = "lubi_wszystkich";
const char * lubi_wspolprace::nazwa = "lubi_wspolprace";
const char * lubi_wspolprace2::nazwa = "lubi_wspolprace2";
const char * lubi_fitness::nazwa = "lubi_fitness";

graf_pelny::graf_pelny() : nazwa("graf_pelny") {}
bool graf_pelny::krawedz(int u, int v) { return true; }

graf_pierscien::graf_pierscien() : nazwa("graf_pierscien") {}
bool graf_pierscien::krawedz(int u, int v) { 
  int uv = u - v; 
  return uv == 1 || uv == -1 || uv == N - 1 || uv == 1 - N; 
}

